const fs = require('fs').promises;
const path = require('path');

/**
 * 只删除当前目录的直接子文件夹中所有 .git 文件夹（排除顶级目录自身的 .git）
 * @param {string} topDir - 顶级目录（当前工作目录）
 */
async function deleteGitFolders(topDir) {
  try {
    // 读取顶级目录下的所有直接子项（文件和文件夹）
    const entries = await fs.readdir(topDir, { withFileTypes: true });

    for (const entry of entries) {
      const fullPath = path.join(topDir, entry.name);

      // 仅处理「直接子文件夹」（非顶级目录自身的 .git）
      if (entry.isDirectory() && entry.name !== '.git') {
        // 进入子文件夹，递归删除其中所有 .git（包括子层级）
        await deleteGitInSubdir(fullPath);
      }
      // 若顶级目录下有 .git 文件夹，直接跳过（不处理）
      // else if (entry.isDirectory() && entry.name === '.git') { /* 跳过 */ }
    }
  } catch (err) {
    console.error(`处理顶级目录 ${topDir} 时出错:`, err.message);
  }
}

/**
 * 在指定子目录内部递归删除所有 .git 文件夹（包括子层级）
 * @param {string} subDir - 要处理的子目录路径（顶级目录的直接子文件夹）
 */
async function deleteGitInSubdir(subDir) {
  try {
    const entries = await fs.readdir(subDir, { withFileTypes: true });

    for (const entry of entries) {
      const fullPath = path.join(subDir, entry.name);

      // 若找到 .git 文件夹则删除
      if (entry.isDirectory() && entry.name === '.git') {
        console.log(`正在删除: ${fullPath}`);
        await deleteFolder(fullPath);
      }
      // 递归处理子目录的更深层级
      else if (entry.isDirectory()) {
        await deleteGitInSubdir(fullPath);
      }
    }
  } catch (err) {
    console.error(`处理子目录 ${subDir} 时出错:`, err.message);
  }
}

/**
 * 递归删除文件夹（包括其内容）
 * @param {string} folderPath - 要删除的文件夹路径
 */
async function deleteFolder(folderPath) {
  try {
    const entries = await fs.readdir(folderPath, { withFileTypes: true });

    // 先删除文件夹内的所有内容
    for (const entry of entries) {
      const fullPath = path.join(folderPath, entry.name);
      if (entry.isDirectory()) {
        await deleteFolder(fullPath);
      } else {
        await fs.unlink(fullPath);
      }
    }

    // 最后删除空文件夹
    await fs.rmdir(folderPath);
  } catch (err) {
    console.error(`删除文件夹 ${folderPath} 时出错:`, err.message);
  }
}

// 从当前工作目录（顶级目录）开始执行
deleteGitFolders(process.cwd())
  .then(() => console.log('所有符合条件的 .git 文件夹处理完成（已排除顶级目录的 .git）'))
  .catch(err => console.error('执行过程中发生错误:', err));